
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>开发过程中索引创建的原则？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>开发过程中索引创建的原则？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">数据库索引的基本作用是什么？它解决了什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">索引的作用类似于书籍的目录，通过建立数据项和数据物理位置之间的映射关系来显著提高查询效率。它解决了在无索引表中查找数据时需要进行全表扫描的问题，避免了查询时间随数据量增长而线性增长，从而提升系统性能。</div>
          </div>
          <div class="card-source">来源: 什么是索引 - 索引的基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">使用数据库索引会带来哪三个主要的代价或开销？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 存储空间：索引是数据表的冗余副本，会占用额外的存储空间。2. 写操作性能：每次对表进行插入、更新或删除时，都必须更新相关联的索引，增加了写操作的开销。3. 索引维护：索引需要定期维护，如重新平衡B-Tree或重新生成统计信息，否则可能导致性能下降。</div>
          </div>
          <div class="card-source">来源: 索引的作用 - 索引的代价</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">原则</div>
          <div class="card-question">在创建联合索引（Composite Index）时，列的顺序应该遵循什么重要原则？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">原则</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在创建联合索引时，通常应将选择性最高（即不同值的数量相对于总行数比例更高）的列放在索引的最左边。这样做可以最大化利用索引的过滤效果，从而提高查询效率。</div>
          </div>
          <div class="card-source">来源: 选择合适的列进行索引 - 5. 联合索引和列顺序</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">请对比B-Tree索引和Hash索引的主要适用场景及其局限性。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">B-Tree索引是大多数关系型数据库的默认类型，它支持高效的等值查询、范围查询和排序操作，性能稳定。而Hash索引通过哈希函数实现O(1)复杂度的查找，仅适用于等值查询，但不支持范围查询和排序操作，且可能因哈希冲突降低性能。</div>
          </div>
          <div class="card-source">来源: 索引的类型选择 - 1. B-Tree 索引 & 2. Hash 索引</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">什么是覆盖索引（Covering Index）？它为什么能提升查询性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">覆盖索引是指一个索引包含了查询所需的所有列。它能提升查询性能，因为数据库可以直接从索引中获取所有需要的数据，而无需回表（即访问表中的数据行），从而极大地减少了I/O操作。</div>
          </div>
          <div class="card-source">来源: 选择合适的列进行索引 - 9. 组合索引与覆盖索引</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">危害</div>
          <div class="card-question">过度索引（Over-indexing）会对数据库系统造成哪些主要危害？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">危害</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">过度索引主要有三大危害：1. 影响插入和更新性能，因为每次写操作都需要更新所有相关索引，增加开销和延迟。2. 浪费存储空间，每个索引都需要占用额外的磁盘空间。3. 增加查询优化器的负担，可能导致其选择次优的查询计划，反而影响查询性能。</div>
          </div>
          <div class="card-source">来源: 避免过度索引 - 1. 理解过度索引的危害</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">聚簇索引（Clustered Index）与非聚簇索引（Non-Clustered Index）的核心区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心区别在于数据的物理存储顺序。聚簇索引将数据行的物理顺序与索引的逻辑顺序保持一致，因此一个表只能有一个聚簇索引。而非聚簇索引的逻辑顺序与数据的物理存储顺序无关，它指向的是数据行的存储位置，一个表可以有多个非聚簇索引。</div>
          </div>
          <div class="card-source">来源: 索引的类型选择 - 8. 聚簇索引（Clustered Index） & 9. 非聚簇索引（Non-Clustered Index）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">原则</div>
          <div class="card-question">为什么通常不建议为低选择性（Low-Selectivity）的列（如性别）单独创建索引？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">原则</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为低选择性列的索引过滤效果有限，查询后返回的结果集可能依然很大，对性能提升不大，甚至可能导致额外的I/O开销。同时，在频繁的写操作中，更新这类索引会增加不必要的系统开销。</div>
          </div>
          <div class="card-source">来源: 选择合适的列进行索引 - 6. 避免索引低选择性列</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">全文索引（Full-Text Index）主要适用于什么场景？它通常基于什么技术实现？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">全文索引主要用于处理大量文本数据的搜索，特别是在处理LIKE操作或复杂文本搜索时，例如搜索引擎、文档管理系统等。它通常基于倒排索引（Inverted Index）实现，记录了每个词汇在文档中的位置，从而能够快速检索。</div>
          </div>
          <div class="card-source">来源: 什么是索引 - 索引的工作原理 & 索引的类型选择 - 3. 全文索引（Full-Text Index）</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
